interface characterMap {
    1: '1';
    2: '2';
    3: '3';
    4: '4';
    5: '5';
    6: '6';
    7: '7';
    8: '8';
    9: '9';
    0: '0';
    q: 'Q';
    w: 'W';
    e: 'E';
    r: 'R';
    t: 'T';
    y: 'Y';
    u: 'U';
    i: 'I';
    o: 'O';
    p: 'P';
    a: 'A';
    s: 'S';
    d: 'D';
    f: 'F';
    g: 'G';
    h: 'H';
    j: 'J';
    k: 'K';
    l: 'L';
    z: 'Z';
    x: 'X';
    c: 'C';
    v: 'V';
    b: 'B';
    n: 'N';
    m: 'M';
    [key: string]: string;
}

type char =
    | '1'
    | '2'
    | '3'
    | '4'
    | '5'
    | '6'
    | '7'
    | '8'
    | '9'
    | '0'
    | 'q'
    | 'w'
    | 'e'
    | 'r'
    | 't'
    | 'y'
    | 'u'
    | 'i'
    | 'o'
    | 'p'
    | 'a'
    | 's'
    | 'd'
    | 'f'
    | 'g'
    | 'h'
    | 'j'
    | 'k'
    | 'l'
    | 'z'
    | 'x'
    | 'c'
    | 'v'
    | 'b'
    | 'n'
    | 'm';

type RestChars<T> = T extends `${char}${infer P}` ? P : '';

type UpperFirst<T> = T extends `${infer P}${string}`
    ? `${characterMap[P]}${RestChars<T>}`
    : T;

export function createKey<P extends string, S extends string>(
    prefix: P,
    suffix: S,
): S extends 'default' ? P : `${P}${UpperFirst<S>}` {
    return (prefix
        + (suffix === 'default'
            ? ''
            : suffix.replace(/^[a-z]/, (startChar) =>
                startChar.toUpperCase(),
            ))) as any;
}
